package com.sybil.spa.dao;

import com.sybil.spa.dominio.Flujo;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

@Repository("flujoDAO")
public class FlujoDAO extends AbstractDAO<Flujo, String> {

   private final String[] tipos = {"RE", "GE"};

   public FlujoDAO() {
      super(Flujo.class);
   }

   public Flujo getFlujo(String clave) {
      return obtener(clave);
   }

   public List<Flujo> getFlujos(boolean activos) {
      if (activos) {
         return obtener(Restrictions.and(Restrictions.eq("estatus", "A"), Restrictions.in("tipo", tipos)));
      } else {
         return obtener(Restrictions.in("tipo", tipos));
      }
   }

   public List<Flujo> getFlujos(String usuarioActual, String tipoFlujo) {
      Criteria c = getCriteria();
      c.add(Restrictions.and(Restrictions.eq("estatus", "A"), Restrictions.eq("tipo", tipoFlujo)));
      c.createAlias("pasos", "p");
      c.add(Restrictions.eq("p.tipo", "I"));
      c.createAlias("p.responsables", "r");
      c.add(Restrictions.eq("r.llave.claveUsuario", usuarioActual));
      Criteria c2 = getCriteria();
      c2.add(Restrictions.and(Restrictions.eq("estatus", "A"), Restrictions.eq("tipo", tipoFlujo)));
      c2.createAlias("pasos", "p");
      c2.add(Restrictions.and(Restrictions.eq("p.tipo", "I"), Restrictions.eq("p.jerarquico", "S")));
      List<Flujo> flujos = c.list();
      flujos.addAll(c2.list());
      return flujos;
   }

   public void guardarFlujo(Flujo flujo) {
      guardar(flujo);
   }

   public void editarFlujo(Flujo flujo) {
      editar(flujo);
   }

   public void eliminarFlujo(Flujo flujo) {
      eliminar(flujo);
   }
}
